package io.renren.modules.archive.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import io.renren.common.utils.*;
import io.renren.modules.archive.dao.ArchiveCollectDao;
import io.renren.modules.archive.entity.ArchiveCollectEntity;
import io.renren.modules.archive.service.ArchiveCollectService;
import io.renren.modules.archive.service.NdJgMenuService;
import io.renren.modules.sys.entity.SysMenuEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;


@Service("archiveCollectService")
public class ArchiveCollectServiceImpl extends ServiceImpl<ArchiveCollectDao, ArchiveCollectEntity> implements ArchiveCollectService {

    @Autowired
    ArchiveCollectDao archiveCollectDao;
    @Autowired
    NdJgMenuService ndJgMenuService;

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<ArchiveCollectEntity> page = this.page(
                new Query<ArchiveCollectEntity>().getPage(params),
                new QueryWrapper<ArchiveCollectEntity>()

        );

        return new PageUtils(page);
    }
    /**
     * 获取所有的档案采集菜单列表
     * @param
     * @return
     */
    public List<ArchiveCollectEntity> getArchivecollectList() {
        // 查询拥有的所有菜单
        List menus = this.baseMapper.selectList(new QueryWrapper<ArchiveCollectEntity>()
                .in("type", 0, 1)
                .ne("level","4")
        );
        //查询完成 对此list直接排序
        Collections.sort(menus);

        // 将id和菜单绑定
        HashMap<Long, ArchiveCollectEntity> menuMap = new HashMap<>(12);
        for (ArchiveCollectEntity s : (List<ArchiveCollectEntity>)menus) {
            menuMap.put(s.getMenuId(), s);
        }
        // 使用迭代器,组装菜单的层级关系
        Iterator<ArchiveCollectEntity> iterator = menus.iterator();
        while (iterator.hasNext()) {
            ArchiveCollectEntity menu = iterator.next();
            ArchiveCollectEntity parent = menuMap.get(menu.getParentId());
            if (Objects.nonNull(parent)) {
                parent.getList().add(menu);
                // 将这个菜单从当前节点移除
                iterator.remove();
            }
        }
        addTempUrl(menus,"");
        return menus;
    }

    /**
     * 获取所有的档案采集菜单列表
     * @param
     * @return
     */
    public List<ArchiveCollectEntity> getArchivecollectAllList() {
        // 查询拥有的所有菜单
        List menus = this.baseMapper.selectList(new QueryWrapper<ArchiveCollectEntity>()
                .in("type", 0, 1)
        );
        //查询完成 对此list直接排序
        Collections.sort(menus);

        // 将id和菜单绑定
        HashMap<Long, ArchiveCollectEntity> menuMap = new HashMap<>(12);
        for (ArchiveCollectEntity s : (List<ArchiveCollectEntity>)menus) {
            menuMap.put(s.getMenuId(), s);
        }
        // 使用迭代器,组装菜单的层级关系
        Iterator<ArchiveCollectEntity> iterator = menus.iterator();
        while (iterator.hasNext()) {
            ArchiveCollectEntity menu = iterator.next();
            ArchiveCollectEntity parent = menuMap.get(menu.getParentId());
            if (Objects.nonNull(parent)) {
                parent.getList().add(menu);
                // 将这个菜单从当前节点移除
                iterator.remove();
            }
        }
        addTempUrl(menus,"");
        return menus;
    }


    /**
     * 获取该机构的档案采集菜单列表
     * @param
     * @return
     */
    public List<ArchiveCollectEntity> getQxList(List<Long> qxList) {
        // 查询拥有的所有菜单
        List<ArchiveCollectEntity> menus = new ArrayList<>();
        if(qxList.size()>0) {
            // 查询拥有的所有菜单
            menus = this.baseMapper.selectList(new QueryWrapper<ArchiveCollectEntity>()
                    .in("type", 0, 1)
                    .in( "menu_id", qxList)
            );
        }
        //查询完成 对此list直接排序
//        Collections.sort(menus);
        menus.sort(Comparator.comparingInt((ArchiveCollectEntity menu) -> Integer.parseInt(menu.getLevel()))
                .thenComparing(ArchiveCollectEntity::getOrderNum));

        // 将id和菜单绑定
        HashMap<Long, ArchiveCollectEntity> menuMap = new HashMap<>(12);
        for (ArchiveCollectEntity s : (List<ArchiveCollectEntity>)menus) {
            menuMap.put(s.getMenuId(), s);
        }
        // 使用迭代器,组装菜单的层级关系
        Iterator<ArchiveCollectEntity> iterator = menus.iterator();
        while (iterator.hasNext()) {
            ArchiveCollectEntity menu = iterator.next();
            if (menu.getLevel().equals("3")){
                LambdaQueryWrapper<ArchiveCollectEntity> lambdaQueryWrapper=Wrappers.lambdaQuery();
                lambdaQueryWrapper.eq(ArchiveCollectEntity::getParentId,menu.getMenuId());
               List<ArchiveCollectEntity>  list=archiveCollectDao.selectList(lambdaQueryWrapper);
               if (list.size()<= Constant.HIDDEN_MENU && list.size() !=0){
                   for (ArchiveCollectEntity ar :list
                           ) {
                       ArchiveCollectEntity a= menuMap.get(ar.getMenuId());
                       a.setParentId(menu.getParentId());
                       menuMap.put(ar.getMenuId(),a);
                   }
                   iterator.remove();
                   continue;
               }
            }

            ArchiveCollectEntity parent = menuMap.get(menu.getParentId());
            if (Objects.nonNull(parent)) {
                parent.getList().add(menu);
                // 将这个菜单从当前节点移除
                iterator.remove();
            }
        }
        addTempUrl(menus,"");
        return menus;
    }

    public void addTempUrl(List<ArchiveCollectEntity> menus,String tempUrl)
    {
        for (int i = 0; i < menus.size(); i++) {
            if("0".equals(menus.get(i).getParentId().toString()) && menus.get(i).getUrl()!=null){
                tempUrl = menus.get(i).getUrl();
            }
            if (menus.get(i).getList()!=null && menus.get(i).getList().size() >= 1) {
                if(!"".equals(tempUrl)){
                    menus.get(i).setUrl(tempUrl);
                }
                addTempUrl(menus.get(i).getList(),tempUrl);
            } else {
                if(!"".equals(tempUrl)){
                    menus.get(i).setUrl(tempUrl);
                }
            }
        }
    }


    @Override
    public List<ArchiveCollectEntity> queryLocalMenu(Map<String, Object> params){

        String menuIdStr = (String) params.get("menuId");
        Long menuId = null;

        try {
            menuId = Long.parseLong(menuIdStr);
        } catch (NumberFormatException e) {
            System.err.println("menuId is not a valid long number: " + menuIdStr);

        }

        List<ArchiveCollectEntity> menuList=archiveCollectDao.queryLocalMenu(menuId);
        return menuList;
    }


    @Override
    public List<ArchiveCollectEntity> queryLocalMenuHaveLevelNull(Map<String, Object> params){

        String menuIdStr = (String) params.get("menuId");
        Long menuId = null;

        try {
            menuId = Long.parseLong(menuIdStr);
        } catch (NumberFormatException e) {
            System.err.println("menuId is not a valid long number: " + menuIdStr);

        }

        List<ArchiveCollectEntity> menuList=archiveCollectDao.queryLocalMenuHaveLevelNull(menuId);
        return menuList;
    }






    public List<ArchiveCollectEntity> queryMenuByLevelAndParentId(List<Long> ndJgMenuList,Long parentId){
        LambdaQueryWrapper<ArchiveCollectEntity> lambdaQueryWrapper= Wrappers.lambdaQuery();
        lambdaQueryWrapper.in(StringUtils.isNotEmpty(ndJgMenuList),ArchiveCollectEntity::getMenuId,ndJgMenuList)
                .eq(ArchiveCollectEntity::getLevel,"4")
                .eq(parentId!=null,ArchiveCollectEntity::getParentId,parentId);
        List<ArchiveCollectEntity> archiveCollectEntityList= archiveCollectDao.selectList(lambdaQueryWrapper);
        return archiveCollectEntityList;
    }

    public List<ArchiveCollectEntity> queryMenuByLevelAndMenuId(List<Long> ndJgMenuList,Long menuId){
        LambdaQueryWrapper<ArchiveCollectEntity> lambdaQueryWrapper= Wrappers.lambdaQuery();
        lambdaQueryWrapper.in(StringUtils.isNotEmpty(ndJgMenuList),ArchiveCollectEntity::getMenuId,ndJgMenuList)
                .eq(ArchiveCollectEntity::getLevel,"4")
                .eq(menuId!=null,ArchiveCollectEntity::getMenuId,menuId);
        List<ArchiveCollectEntity> archiveCollectEntityList= archiveCollectDao.selectList(lambdaQueryWrapper);
        return archiveCollectEntityList;
    }


    public List<ArchiveCollectEntity> selectByParentIdAndLevel(ArchiveCollectEntity archiveCollectEntity){
//        LambdaQueryWrapper<ArchiveCollectEntity> lambdaQueryWrapper= Wrappers.lambdaQuery();
//        lambdaQueryWrapper
//                .eq(archiveCollectEntity.getParentId()!=null,ArchiveCollectEntity::getParentId,archiveCollectEntity.getParentId())
//                .eq(StringUtils.isNotBlank(archiveCollectEntity.getLevel()),ArchiveCollectEntity::getLevel,archiveCollectEntity.getLevel())
//                .orderByAsc(ArchiveCollectEntity::getOrderNum)
//        ;
        List<ArchiveCollectEntity> archiveCollectEntityList= archiveCollectDao.selectByParentIdAndLevel(archiveCollectEntity);
        return archiveCollectEntityList;
    }


    public List<ArchiveCollectEntity> queryListParentId(Long parentId) {
        return baseMapper.queryListParentId(parentId);
    }

    public void delete(Long menuId){
        //删除菜单
        this.removeById(menuId);
        //删除菜单与角色关联
        ndJgMenuService.removeByMap(new MapUtils().put("menu_id", menuId));
    }
}